স্প্রিং বুট ক্লায়েন্টে Connection Pooling এবং Timeout কনফিগারেশন কার্যকর করতে RestTemplate
বা WebClient
ব্যবহার করা যেতে পারে। নিচে ধাপে ধাপে এই কনফিগারেশনগুলো দেখানো হলো।
HttpClient
বা HttpComponentsClientHttpRequestFactory
ব্যবহার করে Connection Pooling সেটআপ করা যায়।
pom.xml
এ Apache HttpClient ডিপেন্ডেন্সি যোগ করুন:
<dependency>
<groupId>org.apache.httpcomponents.client5</groupId>
<artifactId>httpclient5</artifactId>
<version>5.4</version>
</dependency>
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.client5.http.impl.io.PoolingHttpClientConnectionManager;
import org.apache.hc.core5.util.TimeValue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
// Create connection manager
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(50); // Max total connections
connectionManager.setDefaultMaxPerRoute(20); // Max connections per route
connectionManager.setValidateAfterInactivity(TimeValue.ofSeconds(10));
// Create HttpClient with connection manager
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.build();
// Create RestTemplate with custom request factory
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(requestFactory);
}
}
Reactor Netty
ব্যবহার করে WebClient এ Connection Pooling কনফিগার করা যায়।
<dependency>
<groupId>io.projectreactor.netty</groupId>
<artifactId>reactor-netty</artifactId>
</dependency>
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
// Create connection pool
ConnectionProvider provider = ConnectionProvider.builder("custom")
.maxConnections(50)
.pendingAcquireMaxCount(100)
.build();
HttpClient httpClient = HttpClient.create(provider);
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}
HttpComponentsClientHttpRequestFactory
ব্যবহার করে Timeout কনফিগার করা যায়।
import org.apache.hc.client5.http.impl.classic.CloseableHttpClient;
import org.apache.hc.client5.http.impl.classic.HttpClients;
import org.apache.hc.core5.util.Timeout;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
CloseableHttpClient httpClient = HttpClients.custom()
.setDefaultRequestConfig(
org.apache.hc.client5.http.config.RequestConfig.custom()
.setConnectTimeout(Timeout.ofSeconds(5)) // Connection timeout
.setResponseTimeout(Timeout.ofSeconds(10)) // Read timeout
.build()
)
.build();
HttpComponentsClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);
return new RestTemplate(requestFactory);
}
}
HttpClient
ব্যবহার করে WebClient-এ Timeout কনফিগার করা যায়।
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.netty.http.client.HttpClient;
import reactor.netty.resources.ConnectionProvider;
@Configuration
public class WebClientConfig {
@Bean
public WebClient webClient() {
HttpClient httpClient = HttpClient.create()
.responseTimeout(java.time.Duration.ofSeconds(10)) // Response timeout
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000); // Connection timeout
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
}
@Bean
public RestTemplate restTemplate() {
PoolingHttpClientConnectionManager connectionManager = new PoolingHttpClientConnectionManager();
connectionManager.setMaxTotal(50);
connectionManager.setDefaultMaxPerRoute(20);
CloseableHttpClient httpClient = HttpClients.custom()
.setConnectionManager(connectionManager)
.setDefaultRequestConfig(
org.apache.hc.client5.http.config.RequestConfig.custom()
.setConnectTimeout(Timeout.ofSeconds(5))
.setResponseTimeout(Timeout.ofSeconds(10))
.build()
)
.build();
return new RestTemplate(new HttpComponentsClientHttpRequestFactory(httpClient));
}
@Bean
public WebClient webClient() {
ConnectionProvider provider = ConnectionProvider.builder("custom")
.maxConnections(50)
.pendingAcquireMaxCount(100)
.build();
HttpClient httpClient = HttpClient.create(provider)
.responseTimeout(java.time.Duration.ofSeconds(10))
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 5000);
return WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(httpClient))
.build();
}
PoolingHttpClientConnectionManager
ব্যবহার।ConnectionProvider
ব্যবহার।এই পদ্ধতিগুলো ব্যবহার করে আপনি স্প্রিং বুট ক্লায়েন্টে Connection Pooling এবং Timeout সঠিকভাবে কনফিগার করতে পারবেন।
Read more